/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.frames.ControleFramePrincipal;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.EnabledGUIElements;
import controle.gui.utils.setEnabledGUIElements;
import controle.interfaces.Constantes;
import controle.utils.Datas;
import gui.frames.FramePrincipal;
import gui.frames.internos.IFBoletinsPendentes;
import gui.frames.internos.IFVisitaBoletinsPendentes;
import java.sql.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import modelo.*;
import persistencia.dao.AbstractDAO;
import persistencia.dao.TransacaoDAO;

/**
 *
 * @author Usuario
 */
public class ControleBoletinsPendentes extends ControleBoletimPesquisa {

    //Variáveis da classe
    public IFBoletinsPendentes frame = null;

    public ControleBoletinsPendentes(IFBoletinsPendentes frame) {
        super(frame);
        this.frame = frame;
    }

    @Override
    public void inicializa() {

        //Torna o frame visível
        frame.setVisible(true);

        this.limparGUI();
        this.verificaAcessos();

        frame.tabelaVisitas.setModel(new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Id", "Hora", "Quadra", "Logradouro", "Imovel", "Complemento", "Tub. Colet.", "Nº Amost.", "Aeg", "Alb", "Out"
                }) {

            Class[] types = new Class[]{
                java.lang.Integer.class, java.lang.Object.class, java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class,
                java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class
            };
            boolean[] canEdit = new boolean[]{
                false, false, false, false, false, false, false, false, false, false, false
            };

            @Override
            public Class getColumnClass(int columnIndex) {
                return types[columnIndex];
            }

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit[columnIndex];
            }
        });

        //Inicializa eventos da tabela
        frame.tabela.getSelectionModel().addListSelectionListener(frame.listener);
        frame.tabela.getColumnModel().getSelectionModel().addListSelectionListener(frame.listener);
    }

    @Override
    protected void verificaAcessos() {

        //Verifica a permissao de @user para este frame
        if (!ControleFramePrincipal.acessos.get(Constantes.PERMISSAO_CADASTRA_ALTERA_LABORATORIO).isAcesso()) {
            EnabledGUIElements.disabledJComponent(frame.buttonAlterar);
        }
    }

    @Override
    public void limparGUI() {

        //Limpa a memória do frame
        this.setVisitas = new TreeSet<Visitapesquisa>();
        
        new ApagaElementosDaInterface().apagaJTextField(frame.textNLarvasAEG, frame.textNLarvasALB, frame.textNLarvasOUT);
        this.totalBoletinsPendentes();
        this.inicializaModelTabelaVisitas(frame.tabelaVisitas).setNumRows(0);
        
    }

    @Override
    public void guiAtiva(boolean estado) {
        if (estado) {
            setEnabledGUIElements.disabledJComponent(frame.buttonAlterar);

        } else {
            setEnabledGUIElements.enabledJComponent(frame.buttonAlterar);
        }
    }

    @Override
    public void guiAtivacaoBoletim(Boletimpesquisa boletim) {

        if (boletim.isAtivo()) {
            EnabledGUIElements.enabledJComponent(frame.tabelaVisitas, frame.buttonAlterar);

        } else {
            EnabledGUIElements.disabledJComponent(frame.tabelaVisitas, frame.buttonAlterar);

        }

    }

    @Override
    public Boletimpesquisa criaBoletim(int opcao) {

        //Captura o boletim selecionado na tabela
        DefaultTableModel modelo = (DefaultTableModel) frame.tabela.getModel();
        String id = modelo.getValueAt(frame.tabela.getSelectedRow(), 0).toString();

        //Captura o Boletim no Bd
        if (id != null && !id.equals("")) {

            List<Boletimpesquisa> listBol = AbstractDAO.consultar("Boletimpesquisa", "idBoletimPesquisa=" + id);

            if (listBol != null && !listBol.isEmpty()) {

                Boletimpesquisa boletim = listBol.get(0);

                Integer nLarvasAEG = null;
                Integer nLarvasALB = null;
                Integer nLarvasOUT = null;

                //Verifica os campos de número de larvas
                if (!frame.textNLarvasAEG.getText().isEmpty()) {
                    nLarvasAEG = Integer.parseInt(frame.textNLarvasAEG.getText());
                }
                if (!frame.textNLarvasALB.getText().isEmpty()) {
                    nLarvasALB = Integer.parseInt(frame.textNLarvasALB.getText());
                }
                if (!frame.textNLarvasOUT.getText().isEmpty()) {
                    nLarvasOUT = Integer.parseInt(frame.textNLarvasOUT.getText());
                }

                boletim.setnLarvasAEG(nLarvasAEG);
                boletim.setnLarvasALB(nLarvasALB);
                boletim.setnLarvasOUT(nLarvasOUT);

                //Armazena as visitas da memória do frame no boletim atual
                for (Iterator it = this.setVisitas.iterator(); it.hasNext();) {
                    ((Visitapesquisa) it.next()).setBoletimpesquisa(boletim);
                }
                boletim.setVisitapesquisas(this.setVisitas);


                return boletim;

            } else {
                JOptionPane.showMessageDialog(frame, "Boletim não encontrado no banco de dados!", "Atenção!", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "Selecione um boletim cadastrado no banco de dados!", "Atenção!", JOptionPane.WARNING_MESSAGE);
        }

        return null;

    }

    @Override
    public boolean preencheGui(Boletimpesquisa boletim) {

        this.limparGUI();

        //Preenche as visitas do boletim atual
        this.setVisitas.clear();
        for (Iterator it = boletim.getVisitapesquisas().iterator(); it.hasNext();) {
            this.setVisitas.add((Visitapesquisa) it.next());
        }
        this.setTabelaVisitas();

        //Preenche as informações de número de larvas
        if (boletim.getnLarvasAEG() != null) {
            frame.textNLarvasAEG.setText(boletim.getnLarvasAEG().toString());
        }
        if (boletim.getnLarvasALB() != null) {
            frame.textNLarvasALB.setText(boletim.getnLarvasALB().toString());
        }
        if (boletim.getnLarvasOUT() != null) {
            frame.textNLarvasOUT.setText(boletim.getnLarvasOUT().toString());
        }

        //Configura o comportamento dos botões da interface
        this.guiAtiva(false);
        this.guiAtivacaoBoletim(boletim);
        this.verificaAcessos();

        return true;
    }

    @Override
    public boolean buscar() {

        this.totalBoletinsPendentes();

        //Captura os parametros do frame
        String id = frame.textBuscaId.getText();
        String codigoAgente = frame.textBuscaCodigoAgente.getText().trim();
        Date data = Datas.getDate(frame.textBuscaData.getText());
        String codigoLocalidade = frame.textBuscaCodigoLocalidade.getText().trim();
        String codigoMunicipio = frame.textBuscaCodigoMunicipio.getText().trim();

        //Realiza a busca no bd
        List<Boletimpesquisa> list = null;

        List<Municipio> listMun = null;
        List<Localidade> listLoc = null;

        if (!frame.textBuscaCodigoMunicipio.getText().isEmpty()) {
            listMun = this.getListMunicipio(codigoMunicipio);
            if (listMun == null) {
                return false;
            }
        }
        if (!frame.textBuscaCodigoLocalidade.getText().isEmpty()) {
            listLoc = this.getListLocalidade(codigoLocalidade, listMun.get(0));
            if (listLoc == null) {
                return false;
            }
        }

        //Incrementa a string para consutar a busca
        String query = " AND ";
        if (!codigoAgente.isEmpty()) {
            List<Agente> listAge = null;
            if (!codigoAgente.equals("-1")) {
                listAge = AbstractDAO.consultar("Agente", "codigo=" + codigoAgente);
            } else {
                listAge = AbstractDAO.consultar("Agente", "codigo=" + codigoAgente + " AND nome='" + frame.comboBuscaAgente.getSelectedItem().toString() + "'");
            }
            if (listAge != null) {
                query += " b.agente.idAgente=" + listAge.get(0).getIdAgente();
            } else {
                JOptionPane.showMessageDialog(frame, "Código de agente inexistente ou inativo!", "Atenção!", JOptionPane.WARNING_MESSAGE);
            }
        }
        if (data != null) {
            if (query.length() > 5) {
                query += " AND ";
            }
            query += " b.data='" + data + "'";
        }
        if (listLoc != null) {
            if (query.length() > 5) {
                query += " AND ";
            }
            query += " b.localidade.idLocalidade=" + listLoc.get(0).getIdLocalidade();
        }
        if (listMun != null) {
            if (query.length() > 5) {
                query += " AND ";
            }
            query += " b.municipio.idMunicipio=" + listMun.get(0).getIdMunicipio();
        }
        if (id != null && !id.isEmpty()) {
            if (query.length() > 5) {
                query += " AND ";
            }
            query += " b.idBoletimPesquisa=" + id;
        }

        query = "from Boletimpesquisa b LEFT JOIN FETCH b.visitapesquisas as v LEFT JOIN FETCH b.agente a LEFT JOIN FETCH b.municipio m LEFT JOIN FETCH b.localidade lc "
               + " where (((v.larvasAeg is null OR v.larvasAlb is null OR v.larvasOut is null "
                + " OR v.aegA is null OR v.aegB is null OR v.aegC is null OR v.aegD is null OR v.aegE is null OR v.aegF is null OR v.aegG is null OR v.aegH is null OR v.aegI is null"
                + " OR v.albA is null OR v.albB is null OR v.albC is null OR v.albD is null OR v.albE is null OR v.albF is null OR v.albG is null OR v.albH is null OR v.albI is null) "
                + " AND v.idVisitaPesquisa is not null) "
                + " OR b.nLarvasAEG is null OR b.nLarvasALB is null OR b.nLarvasOUT is null) "
                + query + " group by v.boletimpesquisa.idBoletimPesquisa";

        if (!query.equals("")) {
            //System.out.println(query);
            list = AbstractDAO.consultar(query);
        }

        //Lista os objetos encontrados na tabela
        if (list != null) {
            this.listarPesquisaNaTabela(list, frame.tabela);
        } else {
            this.listarPesquisaNaTabela(null, frame.tabela);
        }

        return true;
    }

    @Override
    public void limparBusca() {

        new ApagaElementosDaInterface().apagaJTextField(frame.textBuscaId, frame.textBuscaCodigoLocalidade,
                frame.textBuscaCodigoMunicipio, frame.textBuscaData, frame.textBuscaCodigoAgente,
                frame.textBuscaNomeMunicipio);
        new ApagaElementosDaInterface().apagaJComboBox(frame.comboBuscaAgente, frame.comboBuscaLocalidade);
        this.limparGUI();
        this.listarPesquisaNaTabela(null, frame.tabela);
    }

    /**
     * Altera o objeto através do frame
     */
    @Override
    public void alterar() {

        //Verifica se existe algum número de amostra duplicado na tabela de visitas
        if (this.verificaAmostrasRepetidasTabelaVisitas()) {
            return;
        }

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja alterar o boletim?", "Alteração de boletim",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Boletimpesquisa boletim = this.criaBoletim(opcao);

        //Realiza o cadastro
        if (boletim != null) {
            if (AbstractDAO.alterar(boletim)) {
                JOptionPane.showMessageDialog(frame, "Boletim alterado com sucesso!", "Alteração.", JOptionPane.INFORMATION_MESSAGE);
                this.buscar();
                //this.preencheGui(boletim);
                this.limparGUI();

                //Log do Agente
                TransacaoDAO.cadastrar("Alterou (laboratório) o boletim de pesquisa id=" + boletim.getIdBoletimPesquisa() + ".");
            }
        }

    }

    @Override
    public void editarVisita() {

        //Focaliza o novo JInternalFrame
        IFVisitaBoletinsPendentes frameAdd = new IFVisitaBoletinsPendentes(this);
        FramePrincipal.desktopPanel.add(frameAdd);
        FramePrincipal.desktopPanel.getDesktopManager().activateFrame(frameAdd);
        frameAdd.exibirVisita();

    }

    @Override
    public void setTabelaVisitas() {

        DefaultTableModel modelo = this.inicializaModelTabelaVisitas(frame.tabelaVisitas);
        modelo.setNumRows(0);

        //Verifica se há alguma visita para este boletim
        if (this.setVisitas != null) {
            if (this.setVisitas.size() > 0) {

                //Percorre cada visita e preenche cada linha da tabela de visitas
                for (Iterator it = this.setVisitas.iterator(); it.hasNext();) {
                    Visitapesquisa obj = (Visitapesquisa) it.next();

                    //Verifica se a visita está pendente
                    if (obj.getLarvasAeg() == null || obj.getLarvasAlb() == null || obj.getLarvasOut() == null ||
                            obj.getAegA() == null || obj.getAegB() == null || obj.getAegC() == null || obj.getAegD() == null || 
                            obj.getAegE() == null || obj.getAegF() == null || obj.getAegG() == null || obj.getAegH() == null || 
                            obj.getAegI() == null || obj.getAlbA() == null || obj.getAlbB() == null || obj.getAlbC() == null || 
                            obj.getAlbD() == null || obj.getAlbE() == null || obj.getAlbF() == null || obj.getAlbG() == null || 
                            obj.getAlbH() == null || obj.getAlbI() == null) {

                        //Insere a visita na tabela de visitas pendentes
                        modelo.addRow(new Object[]{obj.getIdVisitaPesquisa(), obj.getHora(), obj.getQuadra().getCodigo(),
                                    obj.getLogradouro().getNome(), obj.getImovel().getNumero(), obj.getImovel().getComplemento(),
                                    obj.getNumeroTubitos(), obj.getNumeroAmostra(), obj.getLarvasAeg(), obj.getLarvasAlb(), obj.getLarvasOut()});
                    }
                }
            }
        }
    }

    /**
     * Verifica o total de boletins com visitas ainda pendentes e notifica na
     * Gui
     *
     * @return
     */
    public boolean totalBoletinsPendentes() {

        //Verifica no bd todas as visitas com número de larvas igual a null
        List<Boletimpesquisa> listPendentes = AbstractDAO.consultar(
                "from Boletimpesquisa b LEFT JOIN FETCH b.visitapesquisas as v LEFT JOIN FETCH b.agente a LEFT JOIN FETCH b.municipio m LEFT JOIN FETCH b.localidade lc "
                + " where (((v.larvasAeg is null OR v.larvasAlb is null OR v.larvasOut is null "
                + " OR v.aegA is null OR v.aegB is null OR v.aegC is null OR v.aegD is null OR v.aegE is null OR v.aegF is null OR v.aegG is null OR v.aegH is null OR v.aegI is null"
                + " OR v.albA is null OR v.albB is null OR v.albC is null OR v.albD is null OR v.albE is null OR v.albF is null OR v.albG is null OR v.albH is null OR v.albI is null) "
                + " AND v.idVisitaPesquisa is not null) "
                + " OR b.nLarvasAEG is null OR b.nLarvasALB is null OR b.nLarvasOUT is null) "
                + " group by v.boletimpesquisa.idBoletimPesquisa");

        //Escreve na Gui o número de boletins pendentes
        if (listPendentes == null) {
            frame.textNumBoletinsPendentes.setText("0");
        } else {
            frame.textNumBoletinsPendentes.setText(listPendentes.size() + "");
        }

        return true;
    }
}
